package common.server.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Type;

/**
 * JSON转换工具
 * @author Administrator
 * @version [版本号, 2017/11/14 0014]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class JsonUtils {


    /**
     * 日志工具
     */
    protected static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);

    /**
     * gson
     */
    private static final Gson GSON = new GsonBuilder().serializeNulls().create();

    /**
     * json 转化为Object对象
     *
     * @param json
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T fromJson(String json, Class<T> clazz) {
        try {
            return GSON.fromJson(json, clazz);
        } catch (Throwable t) {
            logger.error("JsonUtils Error", t);
        }
        return null;
    }

    /**
     *
     * @param json
     * @param type
     * @param <T>
     * @return
     */
    public static <T> T fromJson(String json, Type type) {
        try {
            return GSON.fromJson(json, type);
        } catch (Throwable t) {
            logger.error("JsonUtils Error", t);
        }
        return null;
    }

    /**
     *
     * @param json
     * @param typeToken
     *            要转换的类型
     * @param <T>
     * @return
     */
    public static <T> T fromJson(String json, TypeToken<T> typeToken) {
        return fromJson(json, typeToken.getType());
    }

    /**
     * json 转换为 JSONObject
     * @param json
     * @return
     */
    public static JSONObject fromJson(String json) {
        return JSON.parseObject(json, Feature.OrderedField);
    }

    /**
     * object 对象转化为json字符串
     *
     * @param object
     * @return
     */
    public static String toJson(Object object) {
        try {
            return GSON.toJson(object);
        } catch (Throwable t) {
            logger.error("JsonUtils Error", t);
        }
        return null;
    }
}
